import java.util.ArrayList;

import navalgo3.Modelo.Buque;
import navalgo3.Modelo.Destructor;
import navalgo3.Modelo.Disparo;
import navalgo3.Modelo.Lancha;
import navalgo3.Modelo.Norte;
import navalgo3.Modelo.Portaaviones;
import navalgo3.Modelo.Posicion;
import navalgo3.Modelo.Rompehielos;
import navalgo3.Modelo.Sudoeste;
import navalgo3.Modelo.Sur;


import junit.framework.TestCase;


public class DisparosTests extends TestCase {
	
        public void testDisparoCaeEnUnaPosicion(){
               
                Posicion unaPosicion = new Posicion(2,2);
                Disparo unDisparo = new Disparo(unaPosicion); 
                assertTrue(unDisparo.getPosicion()==unaPosicion);
        }
       
        public void testDisparoCaeEnUnaNave(){
        	
                ArrayList<Posicion> posicionesDeNave = new ArrayList();
                Posicion unaPosicionDeNave = new Posicion (2,1);
                Posicion otraPosicionDeNave = new Posicion (2,2);
                posicionesDeNave.add(unaPosicionDeNave);
                posicionesDeNave.add(otraPosicionDeNave);
                Posicion unaPosicionDeDisparo = new Posicion(2,2);
                Disparo unDisparo = new Disparo (unaPosicionDeDisparo);
                Norte norte = new Norte();
                Lancha unaLancha = new Lancha(posicionesDeNave,norte);
                unaLancha.recibirImpacto(unDisparo);
                assertTrue(unaLancha.tieneDanioEn(unaPosicionDeDisparo));
                              
        }
       
        public void testDisparoCaeEnUnaNaveEnMovimiento(){
        	
        	ArrayList<Posicion> posicionesDeNave = new ArrayList();
            Posicion unaPosicionDeNave = new Posicion (2,3);
            Posicion otraPosicionDeNave = new Posicion (2,4);
            posicionesDeNave.add(unaPosicionDeNave);
            posicionesDeNave.add(otraPosicionDeNave);
            Posicion unaPosicionDeDisparo = new Posicion(2,2);
            Disparo unDisparo = new Disparo (unaPosicionDeDisparo);
            Norte norte = new Norte();
            Lancha unaLancha = new Lancha(posicionesDeNave,norte);
            unaLancha.mover();
            unaLancha.recibirImpacto(unDisparo);
            assertTrue(unaLancha.tieneDanioEn(unaPosicionDeDisparo));
               
        }
        
        /*Tests de disparos que causan da�o sobre las naves */
        public void testDisparoSobreUnaLanchaCausaDanio(){   
        	
        		Posicion posicionDeImpacto = new Posicion (2,2);
        		Disparo unDisparo = new Disparo(posicionDeImpacto);
        		ArrayList<Posicion> posicionInicialLancha = new ArrayList();
        		posicionInicialLancha.add(new Posicion(2,1));
        		posicionInicialLancha.add(new Posicion(2,2));
        		Lancha unaLancha = new Lancha(posicionInicialLancha,new Sur());
        		unaLancha.recibirImpacto(unDisparo);
        		assertTrue(unaLancha.tieneDanioEn(posicionDeImpacto));
        		assertFalse(unaLancha.tieneDanioEn(new Posicion (2,1)));
        }
        
        public void testDisparoSobreUnPortaavionesCausaDanio(){   
        	
    		Posicion posicionDeImpacto = new Posicion (8,4);
    		Disparo unDisparo = new Disparo (posicionDeImpacto);
    		ArrayList<Posicion> posicionInicialPortaaviones = new ArrayList();
    		posicionInicialPortaaviones.add(new Posicion(8,1));
    		posicionInicialPortaaviones.add(new Posicion(8,2));
    		posicionInicialPortaaviones.add(new Posicion(8,3));
    		posicionInicialPortaaviones.add(new Posicion(8,4));
    		posicionInicialPortaaviones.add(new Posicion(8,5));
			Portaaviones unPortaaviones = new Portaaviones(posicionInicialPortaaviones,new Sur());
    		unPortaaviones.recibirImpacto(unDisparo);
    		assertTrue(unPortaaviones.tieneDanioEn(posicionDeImpacto));
    		assertFalse(unPortaaviones.tieneDanioEn(new Posicion (8,5)));
        }
    		
    	 public void testDisparoSobreUnDestructorCausaDanio(){   
    	       	
    		 Posicion posicionDeImpacto = new Posicion (5,5);
    		 Disparo unDisparo = new Disparo (posicionDeImpacto);
     		ArrayList<Posicion> posicionInicialDestructor = new ArrayList();
     		posicionInicialDestructor.add(new Posicion(5,3));
     		posicionInicialDestructor.add(new Posicion(5,4));
     		posicionInicialDestructor.add(new Posicion(5,5));
 			Destructor unDestructor = new Destructor(posicionInicialDestructor,new Norte());
     		unDestructor.recibirImpacto(unDisparo);
     		assertTrue(unDestructor.tieneDanioEn(posicionDeImpacto));
     		assertFalse (unDestructor.tieneDanioEn(new Posicion(5,3)));
     		 }
       		
        public void testCaenDisparosSobreLasPartesDeRompehielosYNoloDestruyen(){
    		ArrayList<Posicion> posicionInicialRompehielos = new ArrayList();
    		posicionInicialRompehielos.add(new Posicion(2,1));
    		posicionInicialRompehielos.add(new Posicion(2,2));
    		posicionInicialRompehielos.add(new Posicion(2,3));
    		Rompehielos unRompehielos = new Rompehielos(posicionInicialRompehielos, new Norte());
    		Disparo disparo1 = new Disparo(new Posicion(2,1));
    		Disparo disparo2 = new Disparo(new Posicion(2,2));
    		Disparo disparo3 = new Disparo(new Posicion(2,3));
    		unRompehielos.recibirImpacto(disparo1);
    		assertTrue(unRompehielos.tieneDanioEn(new Posicion(2,1)));
    		unRompehielos.recibirImpacto(disparo2);
    		assertTrue(unRompehielos.tieneDanioEn(new Posicion(2,2)));
    		unRompehielos.recibirImpacto(disparo3);
    		assertTrue(unRompehielos.tieneDanioEn(new Posicion(2,3)));
    		assertFalse(unRompehielos.estaDestruida());
        }
        
        public void testCaeUnDisparoSobreUnBuqueYEsDestruido(){
        	ArrayList<Posicion> posicionInicialBuque = new ArrayList();
        	posicionInicialBuque.add(new Posicion(5,2));
        	posicionInicialBuque.add(new Posicion(5,3));
        	posicionInicialBuque.add(new Posicion(5,4));
        	posicionInicialBuque.add(new Posicion(5,5));
        	Buque unBuque = new Buque(posicionInicialBuque, new Sudoeste());
        	unBuque.recibirImpacto(new Disparo(new Posicion(5,2)));
        	assertTrue(unBuque.estaDestruida());
        }
        
        /* Tests de disparos y destruccion de naves */
        
        public void testDestruirRompehielos(){
    		ArrayList<Posicion> posicionInicialRompehielos = new ArrayList();
    		posicionInicialRompehielos.add(new Posicion(2,1));
    		posicionInicialRompehielos.add(new Posicion(2,2));
    		posicionInicialRompehielos.add(new Posicion(2,3));
    		Disparo disparo1 = new Disparo(new Posicion(2,1));
    		Disparo disparo2 = new Disparo(new Posicion(2,2));
    		Disparo disparo3 = new Disparo(new Posicion(2,3));
    		Rompehielos unRompehielos = new Rompehielos(posicionInicialRompehielos, new Norte());
    		unRompehielos.recibirImpacto(disparo1);
    		assertTrue(unRompehielos.tieneDanioEn(new Posicion(2,1)));
    		unRompehielos.recibirImpacto(disparo2);
    		assertTrue(unRompehielos.tieneDanioEn(new Posicion(2,2)));
    		unRompehielos.recibirImpacto(disparo3);
    		assertTrue(unRompehielos.tieneDanioEn(new Posicion(2,3)));
    		assertFalse(unRompehielos.estaDestruida());
    		unRompehielos.recibirImpacto(disparo1);
    		unRompehielos.recibirImpacto(disparo2);
    		unRompehielos.recibirImpacto(disparo3);
    		assertTrue(unRompehielos.estaDestruida());
        }
        
        public void testDestruirLancha(){
        	ArrayList<Posicion> posicionInicialLancha = new ArrayList();
    		posicionInicialLancha.add(new Posicion(2,1));
    		posicionInicialLancha.add(new Posicion(2,2));
    		Lancha unaLancha = new Lancha(posicionInicialLancha, new Norte());
    		unaLancha.recibirImpacto(new Disparo(new Posicion(2,1)));
    		unaLancha.recibirImpacto(new Disparo(new Posicion(2,2)));
    		assertTrue(unaLancha.estaDestruida());
    		
        }
        
        public void testDestruirPortaaviones(){
        	ArrayList<Posicion> posicionInicialPortaaviones = new ArrayList();
    		posicionInicialPortaaviones.add(new Posicion(6,2));
    		posicionInicialPortaaviones.add(new Posicion(6,3));
    		posicionInicialPortaaviones.add(new Posicion(6,4));
    		posicionInicialPortaaviones.add(new Posicion(6,5));
    		posicionInicialPortaaviones.add(new Posicion(6,6));
    		Portaaviones unPortaaviones = new Portaaviones(posicionInicialPortaaviones, new Norte());
    		unPortaaviones.recibirImpacto(new Disparo(new Posicion(6,2)));
    		unPortaaviones.recibirImpacto(new Disparo(new Posicion(6,3)));
    		unPortaaviones.recibirImpacto(new Disparo(new Posicion(6,4)));
    		unPortaaviones.recibirImpacto(new Disparo(new Posicion(6,5)));
    		unPortaaviones.recibirImpacto(new Disparo(new Posicion(6,6)));
    		assertTrue(unPortaaviones.estaDestruida());
    		
        }
        
        public void testDestruirDestructor(){
        	ArrayList<Posicion> posicionInicialDestructor = new ArrayList();
    		posicionInicialDestructor.add(new Posicion(7,3));
    		posicionInicialDestructor.add(new Posicion(7,4));
    		posicionInicialDestructor.add(new Posicion(7,5));
    		Destructor unDestructor = new Destructor(posicionInicialDestructor, new Norte());
    		unDestructor.recibirImpacto(new Disparo(new Posicion(7,3)));
    		unDestructor.recibirImpacto(new Disparo(new Posicion(7,4)));
    		unDestructor.recibirImpacto(new Disparo(new Posicion(7,5)));
    		assertTrue(unDestructor.estaDestruida());
    		
        }

       
}

